/*
 * Copyright (C) 2010 Moduad Co., Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.androidpn.client;

import java.util.Random;

import org.androidpn.activity.MainActivity;
import org.androidpn.activity.TalkingActivity;
import org.androidpn.model.CTalkList;
import org.androidpn.model.CTalkMessage;
import org.androidpn.model.CUserInfo;
import org.androidpn.utils.AppCache;
import org.androidpn.utils.ConstanceUtil;
import org.androidpn.utils.JsonUtil;

import android.app.ActivityManager;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.util.Log;

/**
 * This class is to notify the user of messages with NotificationManager.
 *
 * @author Sehwan Noh (devnoh@gmail.com)
 */
public class Notifier {

	private static final String LOGTAG = LogUtil.makeLogTag(Notifier.class);

	private static final Random random = new Random(System.currentTimeMillis());

	private Context context;

	private SharedPreferences sharedPrefs;

	private NotificationManager notificationManager;

	public Notifier(Context context) {
		this.context = context;
		this.sharedPrefs = context.getSharedPreferences(Constants.SHARED_PREFERENCE_NAME, Context.MODE_PRIVATE);
		this.notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
	}

	public void notify(String notificationId, String apiKey, String title, String message, String uri) {
		String runningActivity = getRunningActivityName();
		CTalkMessage cTalkMessage = JsonUtil.parseObject(message, CTalkMessage.class);
		String realmsg ="";
		if(cTalkMessage.getMessage_type() ==ConstanceUtil.MESSAGETYPE_PIC){
			title ="收到一张图片";
			realmsg ="[图片]";
		}else{
		    title ="你有一条未读消息";
		    realmsg =cTalkMessage.getMessage_content();
		}
		if (runningActivity.equals(ConstanceUtil.TALKING_ACTIVITY)) {
			Intent intent = new Intent();
			intent.setAction(ConstanceUtil.TALK_ACTIVITY_BROAD);
			intent.putExtra("talkmessage", cTalkMessage);
			context.sendBroadcast(intent);
		} else {

			if (isNotificationEnabled()) {
				// Show the toast
				if (isNotificationToastEnabled()) {
					// Toast.makeText(context, message,
					// Toast.LENGTH_LONG).show();
				}
				// Notification
				Notification notification = new Notification();
				notification.icon = getNotificationIcon();
				notification.defaults = Notification.DEFAULT_LIGHTS;
				if (isNotificationSoundEnabled()) {
					notification.defaults |= Notification.DEFAULT_SOUND;
				}
				if (isNotificationVibrateEnabled()) {
					notification.defaults |= Notification.DEFAULT_VIBRATE;
				}
				notification.flags |= Notification.FLAG_AUTO_CANCEL;
				notification.when = System.currentTimeMillis();
				notification.tickerText = realmsg;

				// Intent intent;
				// if (uri != null
				// && uri.length() > 0
				// && (uri.startsWith("http:") || uri.startsWith("https:")
				// || uri.startsWith("tel:") || uri.startsWith("geo:"))) {
				// intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));
				// } else {
				// String callbackActivityPackageName = sharedPrefs.getString(
				// Constants.CALLBACK_ACTIVITY_PACKAGE_NAME, "");
				// String callbackActivityClassName = sharedPrefs.getString(
				// Constants.CALLBACK_ACTIVITY_CLASS_NAME, "");
				// intent = new
				// Intent().setClassName(callbackActivityPackageName,
				// callbackActivityClassName);
				// intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
				// intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
				// }

				// Intent intent = new Intent(context,
				// NotificationDetailsActivity.class);
				Intent intent = new Intent(context, TalkingActivity.class);
				CUserInfo cUserInfo =AppCache.getInstance().getUseInfo();
				if(cUserInfo==null){
					return;
				}else{
					if(cUserInfo.getTelephone().equals(cTalkMessage.getSender_telephone())){
						intent.putExtra("receiverTelephone", cTalkMessage.getReceiver_telephone());
					}else{
						intent.putExtra("receiverTelephone", cTalkMessage.getSender_telephone());
					}
				}
                
				intent.putExtra(Constants.NOTIFICATION_ID, notificationId);
				intent.putExtra(Constants.NOTIFICATION_API_KEY, apiKey);
				intent.putExtra(Constants.NOTIFICATION_TITLE, title);
				intent.putExtra(Constants.NOTIFICATION_MESSAGE, realmsg);
				intent.putExtra(Constants.NOTIFICATION_URI, uri);
				intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
				intent.setFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
				intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
				intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
				intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

				CTalkList talkList = new CTalkList();
				// talkList.setFriend_icon(friend_icon);
				// talkList.setFriend_name(friend_name);
				talkList.setMy_telephone(cTalkMessage.getReceiver_telephone());
				talkList.setFriend_telephone(cTalkMessage.getMessage_content());
				PendingIntent contentIntent = PendingIntent.getActivity(context, random.nextInt(), intent,
						PendingIntent.FLAG_UPDATE_CURRENT);

				notification.setLatestEventInfo(context, title, realmsg, contentIntent);
				notificationManager.notify(random.nextInt(), notification);

				// Intent clickIntent = new Intent(
				// Constants.ACTION_NOTIFICATION_CLICKED);
				// clickIntent.putExtra(Constants.NOTIFICATION_ID,
				// notificationId);
				// clickIntent.putExtra(Constants.NOTIFICATION_API_KEY, apiKey);
				// clickIntent.putExtra(Constants.NOTIFICATION_TITLE, title);
				// clickIntent.putExtra(Constants.NOTIFICATION_MESSAGE,
				// message);
				// clickIntent.putExtra(Constants.NOTIFICATION_URI, uri);
				// // positiveIntent.setData(Uri.parse((new StringBuilder(
				// //
				// "notif://notification.adroidpn.org/")).append(apiKey).append(
				// // "/").append(System.currentTimeMillis()).toString()));
				// PendingIntent clickPendingIntent =
				// PendingIntent.getBroadcast(
				// context, 0, clickIntent, 0);
				//
				// notification.setLatestEventInfo(context, title, message,
				// clickPendingIntent);
				//
				// Intent clearIntent = new Intent(
				// Constants.ACTION_NOTIFICATION_CLEARED);
				// clearIntent.putExtra(Constants.NOTIFICATION_ID,
				// notificationId);
				// clearIntent.putExtra(Constants.NOTIFICATION_API_KEY, apiKey);
				// // negativeIntent.setData(Uri.parse((new StringBuilder(
				// //
				// "notif://notification.adroidpn.org/")).append(apiKey).append(
				// // "/").append(System.currentTimeMillis()).toString()));
				// PendingIntent clearPendingIntent =
				// PendingIntent.getBroadcast(
				// context, 0, clearIntent, 0);
				// notification.deleteIntent = clearPendingIntent;
				//
				// notificationManager.notify(random.nextInt(), notification);

			} else {
				Log.w(LOGTAG, "Notificaitons disabled.");
			}
		}
	}

	private int getNotificationIcon() {
		return sharedPrefs.getInt(Constants.NOTIFICATION_ICON, 0);
	}

	private boolean isNotificationEnabled() {
		return sharedPrefs.getBoolean(Constants.SETTINGS_NOTIFICATION_ENABLED, true);
	}

	private boolean isNotificationSoundEnabled() {
		return sharedPrefs.getBoolean(Constants.SETTINGS_SOUND_ENABLED, true);
	}

	private boolean isNotificationVibrateEnabled() {
		return sharedPrefs.getBoolean(Constants.SETTINGS_VIBRATE_ENABLED, true);
	}

	private boolean isNotificationToastEnabled() {
		return sharedPrefs.getBoolean(Constants.SETTINGS_TOAST_ENABLED, false);
	}

	private String getRunningActivityName() {
		ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
		String runningActivity = activityManager.getRunningTasks(1).get(0).topActivity.getClassName();
		return runningActivity;
	}

}
